package com.prj.util;

import java.io.File;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;

public class LargeFileFinder {
    
    // 100MB的字节大小
    private static final long SIZE_THRESHOLD = 100 * 1024 * 1024; // 100MB
    
    public static void main(String[] args) {
        findLargeFile();
//    	String baseDir = "E:\\projectManage\\GEDI\\数据分析-决策支持系统\\03.编码开发\\综合数据管理平台\\源码\\ceec_portal - dm\\portal";
//    	
//    	
//    	List<File> files = FileUtil.loopFiles(baseDir + "\\HighjetBI-Portal\\src\\main" );
//    	//List<File> files = findFiles(new File(baseDir + "\\HighjetBI-Common\\src\\main" ));
//    	
//    	Collections.sort(files, (a, b)-> Long.compare(a.lastModified(),b.lastModified()) );
//    	
//    	System.out.println("start");
//    	
//    	Set<String> ext = new HashSet<String>();
//    	files.forEach(e->{
//    		if(DateTime.of(e.lastModified()).year()>=2024) {
//    			System.out.println(e.getAbsolutePath()+"----"+DateTime.of(e.lastModified()));
//    		}
//    		if(e.getName().contains(".")) {
//    			ext.add(e.getName().substring(e.getName().lastIndexOf(".")));
//    		}else {
//    			ext.add(e.getAbsolutePath());
//    		}
//    	});
    	
    	
    	
    }
    
    static List<File> largeFiles = new ArrayList<>();
    
    private static List<File> findFiles(File directory) {
        // 检查目录是否存在且可读
        if (!directory.exists() || !directory.isDirectory() || !directory.canRead()) {
            System.err.println("无法访问目录: " + directory.getAbsolutePath());
            return largeFiles;
        }
        System.err.println(": " + directory.getAbsolutePath());
        
        // 获取目录内容
        File[] files = directory.listFiles();
        if (files == null) {
            return largeFiles; // 没有访问权限时返回空列表
        }
        for (File file : files) {
            if (file.isDirectory()) {
            	System.err.println("1: " + directory.getAbsolutePath());
                // 递归搜索子目录
                largeFiles.addAll(findLargeFiles(file));
            } else if (file.isFile()) {
                largeFiles.add(file);
                System.out.println(file.getAbsolutePath());
            }
        }
        return largeFiles;
    }
    
    
    

	private static void findLargeFile() {
		// 设置要搜索的目录（修改为你的目标目录）
        File searchDir = new File("F:/");
        
        // 记录开始时间
        long startTime = System.nanoTime();
        
        System.out.println("开始搜索大于100MB的文件...");
        System.out.println("搜索目录: " + searchDir.getAbsolutePath());
        System.out.println("==============================================");
        
        // 执行搜索
        List<File> largeFiles = findLargeFiles(searchDir);
        
        // 记录结束时间
        long endTime = System.nanoTime();
        long duration = TimeUnit.NANOSECONDS.toMillis(endTime - startTime);
        
        // 显示结果
        System.out.println("\n==============================================");
        System.out.println("搜索完成! 耗时: " + duration + " 毫秒");
        System.out.println("找到 " + largeFiles.size() + " 个大于100MB的文件");
        
        if (!largeFiles.isEmpty()) {
            System.out.println("\n文件列表:");
            for (File file : largeFiles) {
                System.out.println(formatFileSize(file.length()) + " - " + file.getAbsolutePath() + " - " + DateTime.of(file.lastModified()) );
            }
        }
	}
    
    /**
     * 递归查找大于100MB的文件
     * @param directory 要搜索的目录
     * @return 大于100MB的文件列表
     */
    private static List<File> findLargeFiles(File directory) {
        List<File> largeFiles = new ArrayList<>();
        
        // 检查目录是否存在且可读
        if (!directory.exists() || !directory.isDirectory() || !directory.canRead()) {
            System.err.println("无法访问目录: " + directory.getAbsolutePath());
            return largeFiles;
        }
        
        // 获取目录内容
        File[] files = directory.listFiles();
        if (files == null) {
            return largeFiles; // 没有访问权限时返回空列表
        }
        
        for (File file : files) {
            if (file.isDirectory()) {
                // 递归搜索子目录
                largeFiles.addAll(findLargeFiles(file));
            } else if (file.isFile() && file.length() > SIZE_THRESHOLD) {
                // 找到大于100MB的文件
                largeFiles.add(file);
                System.out.println("找到: " + formatFileSize(file.length()) + " - " + file.getAbsolutePath());
            }
        }
        
        return largeFiles;
    }
    
    /**
     * 格式化文件大小为易读格式
     * @param size 文件大小（字节）
     * @return 格式化后的字符串
     */
    private static String formatFileSize(long size) {
        if (size <= 0) return "0 B";
        
        final String[] units = new String[]{"B", "KB", "MB", "GB", "TB"};
        int digitGroups = (int) (Math.log10(size) / Math.log10(1024));
        
        // 确保不超过单位数组范围
        digitGroups = Math.min(digitGroups, units.length - 1);
        
        double sizeValue = size / Math.pow(1024, digitGroups);
        
        // 使用DecimalFormat确保小数点后最多两位
        DecimalFormat df = new DecimalFormat("#,##0.##");
        return String.format("%8s", df.format(sizeValue) + " " + units[digitGroups]);
    }
}
